﻿namespace MicroCloud.Entity.BatchConfiguration
{
    /// <summary>
    /// 配置实体属性并发令牌(乐观锁)规则
    /// </summary>
    public class PropertyConcurrencyTokenConfiguration : IEntityBatchConfiguration
    {
        /// <summary>
        /// 配置指定的<see cref="IMutableEntityType"/>
        /// </summary>
        /// <param name="modelBuilder">模型构建器</param>
        /// <param name="mutableEntityType">实体的 <see cref="IMutableEntityType"/> 类型</param>
        /// <param name="database">数据库相关信息和操作的访问 <see cref="DatabaseFacade"/> 类型</param>
        /// <param name="dbContextOptions">数据上下文配置 <see cref="DbContextOption"/> 类型</param>
        /// <param name="dbContextType">数据上下文类型</param>
        public void Configure(ModelBuilder modelBuilder, IMutableEntityType mutableEntityType, DatabaseFacade database, DbContextOption dbContextOptions, Type dbContextType)
        {
            /***由EF控制的乐观并发逻辑效果不理想，代码注释备查，改为由框架层自主控制***/
            //var clrType = mutableEntityType.ClrType;
            //var entityTypeBuilder = modelBuilder.Entity(clrType);
            //var props = clrType.GetProperties().Where(o => o.MemberType == MemberTypes.Property && !o.IsVirtual() && o.GetAttribute<NotMappedAttribute>() == null);

            //#region "根据IDataVersion接口装载器配置相应字段乐观并发锁"
            //var dataVersionType = typeof(IDataVersion);
            //if (dataVersionType.IsAssignableFrom(clrType))
            //{
            //    var dataVersionPropertys = dataVersionType.GetProperties().Where(o => o.MemberType == MemberTypes.Property);

            //    foreach (var dataVersionProperty in dataVersionPropertys)
            //    {
            //        if (props.Any(o => o.Name == dataVersionProperty.Name))
            //        {
            //            //配置是否应将此属性用作并发令牌。如果将属性配置为并发令牌，
            //            //则在Microsoft.EntityFrameworkCore.DbContext.SaveChanges期间更新或删除此实体类型的实例时，
            //            //将检查数据库中的值，以确保自从数据库检索实例以来该实例未发生更改。
            //            //如果已更改，则将引发异常，并且更改不会应用于数据库。
            //            entityTypeBuilder.Property(dataVersionProperty.Name).IsConcurrencyToken(true);
            //            //entityTypeBuilder.Property(dataVersionProperty.Name).IsRowVersion(); //自动配置并发值，但是建议只在MSSQL中使用
            //            //同时配置该字段为索引字段
            //            entityTypeBuilder.HasIndex(dataVersionProperty.Name).HasDatabaseName($"IX_{mutableEntityType.GetTableName()}_{dataVersionProperty.Name}").IsUnique(false);
            //        }
            //    }
            //}
            //////将属性配置为在保存新实体或现有实体时生成值。
            ////entityTypeBuilder.Property("").ValueGeneratedOnAddOrUpdate();
            //////将属性配置为Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder.ValueGenerateDorUpdate
            //////和Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder.IsConcurrencyToken（System.Boolean）。
            //////数据库提供程序可以选择以不同的方式解释这一点，但它通常用于指示某种形式的自动行版本控制，用于乐观并发检测。
            ////entityTypeBuilder.Property("").IsRowVersion();
            //#endregion

        }

    }

}